package com.yan.design.java8.k8;

import com.yan.design.pojo.Po;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 动态代理
 *      需要实现 InvocationHandler 接口
 * @author shengren.yan
 * @create 2022-08-28
 */
public class Class2 implements InvocationHandler {

    // 目标对象
    private Object target;

    // 动态生成代理对象
    public Object newOBJ(Object obj){

        this.target = obj;
        // 参数1：指代理类由哪个类加载器加载
        // 参数2：指代理类实现哪些接口 （与目标对象一致）
        // 参数3：实现 InvocationHandler 接口的实现类实例，可执行invoke方法
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
    }

    // 参数 代理对象、方法、参数
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("代理之前");
        Object invoke = method.invoke(target, args); // 返回对象
        System.out.println("代理之后");
        return invoke;
    }

    // 测试使用
    public static void main(String[] args) {
        Class2 class2 = new Class2();
        // 得到APOJO对象，可执行它下面的方法
        APOJO o = (APOJO) class2.newOBJ(new APOJO());
        o.getName();

        Po o2 = (Po) class2.newOBJ(new Po());
        o2.getAge();

    }
}
